﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using orienta.Utils;
using orienta.Models;
using orienta.ViewModels;
using orienta.Helper;
using System.Collections;

namespace orienta.Controllers
{
    public class MaePersonasController : Controller
    {
        private GoodTireEntities db = new GoodTireEntities();

        public int _TABLA_UBIGEO = 30;
        public int _TABLA_DISCAPACIDAD = 3;
        public int _COD_TIPO_DOC_DNI = 37;
        public int _COD_TIPO_DOC_NO_TIENE = 40;
        //
        // GET: /MaePersonas/

        public ViewResult Index()
        {
            var ORIMaePersona = db.ORIMaePersona.Include("ORIDetCompendio").Include("ORIDetCompendio1").Include("ORIDetCompendio2").Include("ORIMaeUsuario");
            return View(ORIMaePersona.ToList());
        }

        //mvalle
        public ViewResult Buscar()
        {
            //Response.Write(vNumDocum);
            String vNumDocum = Request["vNumDocum"].ToString();
            decimal nIdiPaisSolic = Int32.Parse(Request["nIdiPaisSolic"]);


            ORIMaePersona ORIMaePersona = db.ORIMaePersona.Single(o => o.vNumDocum.Equals(vNumDocum) && o.nIdeCodPaisDoc.Equals(nIdiPaisSolic));
            if (ORIMaePersona.nIdeTipoGenero == Constantes.GENERO_PERSONA.MASCULINO)
                ViewBag.genero = "Masculino";
            else
                ViewBag.genero = "Femenino";
            return View(ORIMaePersona);
        }

        //
        // GET: /MaePersonas/Details/5

        public ViewResult Details(decimal id)
        {
            ORIMaePersona ORIMaePersona = db.ORIMaePersona.Single(o => o.nIdePersona == id);

            return View(ORIMaePersona);
        }

        //
        // GET: /MaePersonas/Create

        public ActionResult Create()
        {
            ViewBag.nIdeTipoPer = new SelectList(db.ORIDetCompendio, "nIdeDetalle", "vCodElemento");
            ViewBag.nIdeDisca = new SelectList(db.ORIDetCompendio, "nIdeDetalle", "vCodElemento");
            ViewBag.nIdeTipoGenero = new SelectList(db.ORIDetCompendio, "nIdeDetalle", "vCodElemento");
            ViewBag.nIdUsuReg = new SelectList(db.ORIMaeUsuario, "nIdUsu", "vCodUsuario");
            cargarCombosFormulario();
            cargarCombosFormularioDireccion();
            return View();
        }

        private void cargarCombosFormulario()
        {
            HtmlUtils htmlUtils = new HtmlUtils();
            CompendioDetalleHelper CompDetHelper = new CompendioDetalleHelper();

            ViewBag.TipoModalidad = htmlUtils.getComboTipoModalidad();
            ViewBag.Idioma = htmlUtils.getComboIdioma();
            ViewBag.TipoDocumento = htmlUtils.getComboTipoDocumento();
            ViewBag.TipoDiscapacidad = htmlUtils.getComboTipoDiscapacidad();
            ViewBag.TipoSolicitante = htmlUtils.getComboTipoSolicitante();
            ViewBag.TipoPersona = htmlUtils.getComboTipoPersona();
            ViewBag.TipoPrioridad = htmlUtils.getComboTipoPrioridad();
            ViewBag.Pais = htmlUtils.getComboPais();
            ViewBag.ClaseSolicitud = htmlUtils.getComboClaseSolicitud();
            ViewBag.TipoSolicitud = htmlUtils.getComboTipoSolicitud();
            ViewBag.ParaAtender = htmlUtils.getComboParaAtender();
            ViewBag.Prioridad = htmlUtils.getComboPrioridad();
            ViewBag.PrioridadSolicitud = htmlUtils.getComboPrioridadSolicitud();
            ViewBag.Programa = htmlUtils.getComboProgramaMidis();
            ViewBag.Plazo = htmlUtils.getComboPlazo();
            ViewBag.TipoGeneroPersona = htmlUtils.getComboTipoGeneroPersona();
            ViewBag.Discapacidad = CompDetHelper.getCompendioDetalleList(_TABLA_DISCAPACIDAD);

        }

        private void cargarCombosFormularioDireccion()
        {
            HtmlUtils htmlUtils = new HtmlUtils();
            ViewBag.TipoVia = htmlUtils.getComboTipoVia();
            ViewBag.TipoZona = htmlUtils.getComboTipoZona();
            ViewBag.Pais = htmlUtils.getComboPais();
            //ViewBag.Departamento = htmlUtils.getComboPais();

        }

        public ActionResult ValidarNumDoc(String sNumDoc, int nIdeTipoDoc)
        {
            int iNumCaract = sNumDoc.Length;

            if (nIdeTipoDoc == _COD_TIPO_DOC_NO_TIENE)
            {

            }
            else 
            {
                if (nIdeTipoDoc == _COD_TIPO_DOC_DNI)
                {
                    if (iNumCaract != 8)
                    {
                        return Json(string.Format("DNI {0} es inválido, debe contener 8 digitos", sNumDoc),
                            JsonRequestBehavior.AllowGet);
                    }
                }
                else 
                {
                    if (iNumCaract == 0)
                    {
                        return Json(string.Format("El nro. de documento es obligatorio."),
                            JsonRequestBehavior.AllowGet);
                    }
                }

                int intNumPersonas = buscarTipoNroDoc(sNumDoc, nIdeTipoDoc);
                if (intNumPersonas > 0)
                {
                    return Json(string.Format("Nro. documento {0} es inválido, ya se encuentra registrado en la base de datos", sNumDoc),
                           JsonRequestBehavior.AllowGet);
                }
            }

            return Json(true, JsonRequestBehavior.AllowGet);
        }

        public int buscarTipoNroDoc(string strNumDoc, int intTipoDoc)
        {
            DependenciaHelper dependenciaHelper = new DependenciaHelper();
            int nNumPersonas = dependenciaHelper.getNumPersonas(strNumDoc, intTipoDoc);
            return nNumPersonas;
            
        }

        public ActionResult ValidarFechaNac(String dtFecNac)
        {
            try
            {
                DateTime dt1 = DateTime.Now.Date;
                DateTime dtFechaNac = FormUtils.formatearFecha(dtFecNac, "dd/MM/yyyy");
                //DateTime dt2 = Convert.ToDateTime(dtFecNac.Trim()).Date;
                DateTime dt3 = Convert.ToDateTime(dtFechaNac).Date;
                //DateTime dtFecRegistro = FormUtils.formatearFecha(personainfoview.dtFecNac, "dd/MM/yyyy");
                if (dt1 >= dt3)
                {
                    return Json(true, JsonRequestBehavior.AllowGet);
                }
                else
                {
                    return Json(string.Format("Fecha de Nacimiento {0} es inválido. No puede ser mayor a la fecha actual.", dtFecNac),
                           JsonRequestBehavior.AllowGet); 
                }
            }
            catch {
                //throw ExceptionContext
                return Json(string.Format("Formato Fecha de Nacimiento {0} es inválido.", dtFecNac),
                              JsonRequestBehavior.AllowGet);
            }



        }

        //
        // POST: /MaePersonas/Create

        [HttpPost]
        public ActionResult Create(PersonaInfo personainfoview)
        {
            if (ModelState.IsValid)
            {
                ORIMaePersona objpersona = new ORIMaePersona();
                SolicitudHelper solicitudHelper = new SolicitudHelper();
                decimal intCodUbigeo = 0;

                decimal nNumPersona = solicitudHelper.getIdPersona();
                objpersona.nIdePersona = nNumPersona;
                objpersona.vPriNombre = personainfoview.sPrimerNombre;
                objpersona.vSegNombre = personainfoview.sSegundoNombre;
                objpersona.vPriApellido = personainfoview.sApellidoPaterno;
                objpersona.vSegApellido = personainfoview.sApellidoMaterno;
                objpersona.nIdeCodPaisDoc = personainfoview.nIdePais;
                objpersona.nIdeTipoDocum = personainfoview.nIdeTipoDoc;
                if (personainfoview.nIdeTipoDoc == _COD_TIPO_DOC_NO_TIENE)
                {
                    objpersona.vNumDocum = nNumPersona.ToString();
                }
                else 
                {
                    objpersona.vNumDocum = personainfoview.sNumDoc;
                }
                
                objpersona.nIdeTipoPer = personainfoview.nIdeTipoPers;
                objpersona.nIdeTipoGenero = personainfoview.nIdeGenero;
                objpersona.vTelefono1 = personainfoview.sNumTelf1;
                objpersona.vTelefono2 = personainfoview.sNumTelf2;
                DateTime dtFecRegistro = FormUtils.formatearFecha(personainfoview.dtFecNac, "dd/MM/yyyy");
                objpersona.dtFecNacim = dtFecRegistro;
                objpersona.dtFecReg = DateTime.Now;
                //mvalle
                objpersona.nIdeUsuReg = 1;
                objpersona.vEmail = personainfoview.sEmail;

                db.ORIMaePersona.AddObject(objpersona);
                db.SaveChanges();
                //return RedirectToAction("Index");

                //Discapacidades
                string disc = Request.Form["discapacidad"];
                if (!string.IsNullOrEmpty(disc)) {
                    string[] array_iddisc = disc.Split(',');
                    int numDisc = 1;
                    foreach (string iddisc in array_iddisc)
                    {
                        ORIDetDiscapacidad objDetDiscapacidad = new ORIDetDiscapacidad();
                        objDetDiscapacidad.nIdePersona = nNumPersona;
                        objDetDiscapacidad.nSeqDisca = numDisc;
                        objDetDiscapacidad.nIdeTipoDisca = Convert.ToInt32(iddisc);
                        objDetDiscapacidad.dtFecIniVig = DateTime.Now;
                        objDetDiscapacidad.nIdeUsu = 1;
                        db.ORIDetDiscapacidad.AddObject(objDetDiscapacidad);
                        db.SaveChanges();
                        numDisc++;
                    }
                }

                
                ORIDetDireccion objDireccion = new ORIDetDireccion();
                objDireccion.nIdePersona = nNumPersona;
                //objDireccion.nSeqDirec = new Decimal(1);
                objDireccion.nIdeTipoVia = personainfoview.PersonaDireccion.nIdeTipoVia;
                objDireccion.vNomVia = personainfoview.PersonaDireccion.sNombreVia;
                objDireccion.vNumVia = personainfoview.PersonaDireccion.sNumeroVia;
                objDireccion.vNumDep = personainfoview.PersonaDireccion.sDepartamento + "/" + personainfoview.PersonaDireccion.sInterior;
                objDireccion.vNumManza = personainfoview.PersonaDireccion.sManzana;
                objDireccion.vNumLote = personainfoview.PersonaDireccion.sLote;
                objDireccion.vNumKilom = personainfoview.PersonaDireccion.sKm;
                objDireccion.vNumBlock = personainfoview.PersonaDireccion.sBlock;
                objDireccion.vNumEtapa = personainfoview.PersonaDireccion.sEtapa;
                objDireccion.nIdeTipoZona = personainfoview.PersonaDireccion.nIdeTipoZona;
                objDireccion.vNomZona = personainfoview.PersonaDireccion.sNombreZona;

                string strCodUbigeo = personainfoview.PersonaDireccion.sUbigeoDistrito;
                ORIDetCompendio objDetCompendio = db.ORIDetCompendio.SingleOrDefault(o => (o.nIdeCompendio == _TABLA_UBIGEO && o.vCodElemento == strCodUbigeo));
                if (objDetCompendio != null)
                {
                    intCodUbigeo = objDetCompendio.nIdeDetalle;
                }
                objDireccion.nIdeCodUbigeo = intCodUbigeo;
                objDireccion.vCenPoblado = personainfoview.PersonaDireccion.sCentroPoblado;
                objDireccion.vRefe1 = personainfoview.PersonaDireccion.sReferencia1;
                objDireccion.vRefe2 = personainfoview.PersonaDireccion.sReferencia2;

                objDireccion.nIdeUsuReg = 1;

                db.ORIDetDireccion.AddObject(objDireccion);
                db.SaveChanges();
                //mvalle
                personainfoview.nIdePersona = objpersona.nIdePersona;

                return View("Confirmacion", personainfoview);
            }

            cargarCombosFormulario();
            cargarCombosFormularioDireccion();
            return View(personainfoview);
        }

        //
        // GET: /MaePersonas/Edit/5

        public ActionResult Edit(decimal id)
        {
            ORIMaePersona ORIMaePersona = db.ORIMaePersona.Single(o => o.nIdePersona == id);
            ViewBag.nIdeTipoPer = new SelectList(db.ORIDetCompendio, "nIdeDetalle", "vCodElemento", ORIMaePersona.nIdeTipoPer);
            //@todo.. lucho quito este campo ViewBag.nIdeDisca = new SelectList(db.ORIDetCompendio, "nIdeDetalle", "vCodElemento", ORIMaePersona.nIdeDisca);
            ViewBag.nIdeTipoGenero = new SelectList(db.ORIDetCompendio, "nIdeDetalle", "vCodElemento", ORIMaePersona.nIdeTipoGenero);
            ViewBag.nIdUsuReg = new SelectList(db.ORIMaeUsuario, "nIdUsu", "vCodUsuario", ORIMaePersona.nIdeUsuReg);
            return View(ORIMaePersona);
        }

        //
        // POST: /MaePersonas/Edit/5

        [HttpPost]
        public ActionResult Edit(ORIMaePersona ORIMaePersona)
        {
            if (ModelState.IsValid)
            {
                db.ORIMaePersona.Attach(ORIMaePersona);
                db.ObjectStateManager.ChangeObjectState(ORIMaePersona, EntityState.Modified);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.nIdeTipoPer = new SelectList(db.ORIDetCompendio, "nIdeDetalle", "vCodElemento", ORIMaePersona.nIdeTipoPer);
            //@lucho cambio modelo ViewBag.nIdeDisca = new SelectList(db.ORIDetCompendio, "nIdeDetalle", "vCodElemento", ORIMaePersona.nIdeDisca);
            ViewBag.nIdeTipoGenero = new SelectList(db.ORIDetCompendio, "nIdeDetalle", "vCodElemento", ORIMaePersona.nIdeTipoGenero);
            //@lucho cambio modelo ViewBag.nIdUsuReg = new SelectList(db.ORIMaeUsuario, "nIdUsu", "vCodUsuario", ORIMaePersona.nIdUsuReg);
            return View(ORIMaePersona);
        }

        //
        // GET: /MaePersonas/Delete/5

        public ActionResult Delete(decimal id)
        {
            ORIMaePersona ORIMaePersona = db.ORIMaePersona.Single(o => o.nIdePersona == id);
            return View(ORIMaePersona);
        }

        //
        // POST: /MaePersonas/Delete/5

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(decimal id)
        {
            ORIMaePersona ORIMaePersona = db.ORIMaePersona.Single(o => o.nIdePersona == id);
            db.ORIMaePersona.DeleteObject(ORIMaePersona);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }

        public ViewResult Ubigeo()
        {
            ViewBag.campoUbigeo = "dataUbigeo";
            ViewBag.campoUbigeoDesc = "dataUbigeoDesc";
            IEnumerable list = null;
            list = db.ORIDetCompendio.Where<ORIDetCompendio>(o => o.nIdeCompendio == _TABLA_UBIGEO).ToList();
            return View(list);
        }

    }
}